package com.arpa.wms.service;

import com.arpa.core.web.Result;
import com.arpa.wms.domain.dto.ContainerDTO;
import com.arpa.wms.domain.dto.ContainerExcelDTO;
import com.arpa.wms.domain.entity.Container;
import com.arpa.wms.domain.enums.StatusEnum;
import com.arpa.wms.domain.vo.ContainerVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 容器 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-08-03
 */
public interface IContainerService extends IService<Container> {

    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    boolean save(Container entity);

    /**
     * 根据code更新实体
     * @param entity
     * @return
     */
    int updateByCode(Container entity);

    /**
     * 查询列表
     * @param containerDTO
     * @return
     */
    List<ContainerVO> queryList(ContainerDTO containerDTO);

    /**
     * 查询合计,包含总数
     * @param containerDTO
     * @return
     */
    ContainerVO queryListSum(ContainerDTO containerDTO);

    Map<String,Object> batchdel(List<String> codes);

    Map<String,Object> activeStatus(List<String> code, StatusEnum active);

     /**
      *  @author: Allen chen
      *  @Date: 2020/9/16 15:59
      *  @Description: 根据barCode 查询
      */
    List<ContainerVO> queryByBarCode(String barCode);

     /**
      *  @author: Allen chen
      *  @Date: 2020/10/12 10:03
      *  @Description: 根据code批量查询
      */
    List<ContainerVO> queryByCodes(List<String> list);

    /**
     * 查询可用容器，如果收货单编码存在，则也可使用该收货单占用的容器
     * @param receiveCode
     * @return
     */
    List<Container> queryCanUseList(String receiveCode);

    /**
     * 占用容器
     * @param occupyCode
     * @param containerBarCode
     * @return
     */
    Result occupyContainer(String occupyCode, String containerBarCode,String groupCode);

    /**
     * 波次单占用容器
     * @param occupyCode
     * @param containerBarCode
     * @return
     */
    Result wavePickingOccupyContainer(String occupyCode, String containerBarCode);

    /**
     * 释放单个容器，并清除占用单据号， 不判断容器是否可释放
     * @param containerBarCode
     * @param groupCode
     * @return
     */
    boolean releaseContainer(String containerBarCode,String groupCode);

    /**
     * @description
     * 批量释放容器，并清除占用单据号， 不判断容器是否可释放
     * @author xuyang
     * @date 2020/11/6 14:35
     * @param containerBarCodes:
     **/
    boolean batchReleaseContainer(List<String> containerBarCodes);


    /**
     * @description
     * 判断容器号是否还有库存使用，没有则释放
     * @author xuyang
     * @date 2020/11/6 14:42
     * @param containerBarCodes:
     **/
    void batchReleaseContainerForEmptyInventory(List<String> containerBarCodes,String groupCode);

    /**
     * 根据收货单、容器号集合拼接的字符串，释放该收货单下没有可用收货登记信息关联的容器
     * @param receiveCode
     * @param containerBarCodes
     * @param type 容器类型，空字符串： 所有； 0：托盘；1：周转箱；
     * @return
     */
    boolean batchReleaseContainerByReceive(String receiveCode, String containerBarCodes, String type);

    /**
     * 根据上架单、释放该上架单使用的容器
     * @param putawayCode
     * @param type 容器类型，空字符串： 释放所有； 0：释放托盘类型的容器；1：释放周转箱类型的容器；
     * @return
     */
    boolean batchReleaseContainerByPutaway(String putawayCode, String type,String groupCode);

    /**
     * 获取导入操作预览数据
     * @param list
     * @return
     */
    List<ContainerVO> importPreviewList(List<ContainerExcelDTO> list);

    /**
     * 根据导入码导入数据
     * @param importCode
     * @return
     */
    Result importContainer(String importCode);

    /**
     * 拣货占用容器
     * @param occupyCode
     * @param containerBarCode
     * @return
     */
    Result occupyContainerByPicking(String occupyCode, String containerBarCode);

    /**
     * 校验容器
     * @param containerBarCode
     * @param sourceCode
     * @return
     */
    Result validateContainer( String containerBarCode, String sourceCode,String groupCode);
}
